home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 2: CDPD 1
/
Almathera Ten on Ten - Disc 2: CDPD 1.iso
/
pd
/
076-100
/
092
/
as6502
/
bootsa.asm
< prev
next >
Wrap
Assembly Source File
|
1995-03-13
|
3KB
|
130 lines
.PAGE "VIC Object code boot from USER port"
; BOOT : VIC PROGRAM TO RECEIVE AIM FORMAT OBJECT
; CODE FLIES THROUGH THE VIC USER PORT.
; VIC 6522 VIA PORT ADDRESSES
ORB1 =$9110 ;I/O REGISTER B
DDRB1 =$9112 ;DATA DIRECTION REGISTER B
PCR1 =$911C ;PERIPHERAL CONTROL REGISTER 1
IFR1 =$911D ;INTERRUPT FLAG REGISTER
IER1 =$911E ;INTERRUPT ENABLE REGISTER
; VIC subroutines
STOP =$FFE1 ;check for stop key down
; ZERO PAGE STORAGE
VICKEY =$C5 ;current key down
KISTAK =$C6 ;keyboard input stack
staksav =$fb ;stack save for RCHEK sub
BYTMP =$FD ;INPUT BYTE TEMPORARY
PTRLO =$FE ;LOAD POINTER
PTRHI =$FF
CTLZ =$1a ;end of file charcter
*=$33C ;locate in the tape buffer
BOOT CLD
tsx ;save stack for STOP exit
stx staksav
JSR INITIO ;INIT USER PORT
RECLUP JSR GETCHR ;SCAN FOR A ';'
cmp #CTLZ ;end of file char?
beq bootex ;yes end
CMP #$3b
BNE RECLUP
JSR GETBYT ;GET RECORD LENGTH
TAX ;ZERO?
BEQ EOT ;YES, WE'RE DUN
JSR GETBYT ;GET HI ORDER LOAD ADDRESS
STA PTRHI ;SAVE
JSR GETBYT ;GET LO ORDER
STA PTRLO ;SAVE
LDY #$0 ;CLEAR INDEX
BYTLUP JSR GETBYT ;GET AN OBJECT BYTE
STA (PTRLO),Y ;SAVE IT
INY ;BUMP INDEX
DEX ;COUNT BYTE
BNE BYTLUP ;LOOP 'TILL ZERO
BEQ RECLUP ;THEN GET NEXT RECORD
EOT ;look for control z to end
ENDLUP JSR GETCHR ;TO END THE RECORD
cmp #CTLZ
BNE ENDLUP
bootex clc
RTS
; GETBYT : INPUT TWO ASCII HEX DIGITS AND
; PACK INTO ONE BYTE.
GETBYT JSR GETCHR ;INPUT BYTE
JSR PACK ;PACK INTO 1 NYBBLE
JSR GETCHR ;GET 2ND HALF
JSR PACK ;PACK IT
LDA BYTMP ;RETRIEVE RESULT
RTS
; PACK : PACK ASCII DIGIT INTO NYBBLE
PACK CMP #$3A ;NUMERIC?
AND #$F ;CLEAR HI NYBBLE
BCC NOADD ;YES, SKIP ADD
ADC #8 ;ADD 8 + CARRY
NOADD ASL BYTMP ;SHIFT BYTMP
ASL BYTMP
ASL BYTMP
ASL BYTMP
ORA BYTMP ;INSERT DIGIT
STA BYTMP ;SAVE
RTS
; INITIO : PREPARE THE VIA FOR INPUT
INITIO LDA PCR1 ;GET PCR
AND #$0F;CLEAR B PORT BITS
ORA #$A0 ;SET PULSE MODE
STA PCR1 ;PUT IN PCR
LDA #0 ;SET ALL BITS TO INPUT
STA DDRB1
LDA #$10 ;DISABLE INTERRUPT
STA IER1
LDA ORB1 ;GET FIRST CHARACTER
RTS
; GETCHR : INPUT 1 BYTE FROM USER PORT
GETCHR LDA #$10 ;MASK FOR CB1 INTERRUPT
WAITC JSR RCHEK ;ALLOW INTERRUPTS
BIT IFR1 ;IS IT ON?
BEQ WAITC ;NO, WAIT FOR IT
LDA ORB1 ;RETRIEVE BYTE
STA ORB1 ;NOTIFY SENDER
RTS
; RCHEK : CHECK FOR INTERRUPT
RCHEK PHA ;SAVE ACCUM
JSR STOP ;RUN/STOP KEY DOWN?
BNE CKSPAC ;NO, SKIPPIT
LDA #0 ;CLEAR KEYBOARD STACK
STA KISTAK
ldx staksav ;restore stack
txs
clc
rts ;return to caller
CKSPAC LDA VICKEY ;GET CURRENT KEY
CMP #$20 ;SPACE BAR DOWN?
BEQ CKSPAC ;YES, PAUSE TILL IT LIFTS
LDA #0
STA KISTAK ;CLEAR KEYBOARD STACK
RCOUT PLA
RTS